<?php

/**
 * LoginController
 * 
 * @author Ricardo Simão
 * @version 1.0.1
 * 
 */

require_once 'Zend/Controller/Action.php';

class LoginController extends Zend_Controller_Action  {
	
	/**
	 * Formulário de Autenticação dos utilizadores
	 *
	 * @var array
	 */
	protected $form;
	
	/**
	 * Adapatdor de autenticação de users
	 *
	 * @var Zend_Auth;
	 */
	protected $authAdapter;
	
	/**
	 * Parametros para a autenticação de utilizadores
	 *
	 * @var string
	 */
	protected $params;
	
	/**
	 * Guarda os dados do utilizador para escrever na memória
	 *
	 * @var string
	 */
	protected $data;
	
	/**
	 * Filtra os dados do formulário
	 *
	 * @var mixed
	 */
	protected $filterValues;
	
	/**
	 * Nome do utilizador
	 *
	 * @var string
	 */
	protected $username;
	
	
	/**
	 * Palavra passe do utilizador
	 *
	 * @var string
	 */
	protected $password;
	
	
	/**
	 * Autentica os utilizadores
	 *
	 * @return void
	 */
	
	public function indexAction() {
		
		$form = App_Forms_Login::getForm ();
		//Verifica se o método de envio do formulário é via POST
		if ($form->isValid ( $_POST )) {
			//Filtra os dados
			$filterValues = new Zend_Filter_StripTags ( );
			$username = $filterValues->filter ( $this->_request->getPost ( 'username' ) );
			$password = $filterValues->filter ( $this->_request->getPost ( 'password' ) );
			
			//Define qual o nome da tabela de autenticação, e os campos de nome e palavra passe
			$authAdapter = new App_AuthLogin ( 'users', 'username', 'password' );
			//Define as credenciais de autenticação
			$authAdapter->setCredentials ( $username, $password );
			//Apanha os dados de autenticação
			$params = $authAdapter->getAuthenticationParameters ();
			
			//Compara os dados de autenticação da base de dados com os inseridos pelo utilizador
			$auth = Zend_Auth::getInstance ();
			$result = $auth->authenticate ( $params );
			
			//Se o resultado for válido, escreve em memória os dados do utilizador, EXCEPTO a password
			if ($result->isValid ()) {
				$data = $params->getResultRowObject ( NULL, 'password' );
				$auth->getStorage ()->write ( $data );
				
				//o utilizador é redireccionado para a página das tarefas			
				$this->_redirect ( '/tasks' );
			} else {
				
				//as credenciais não estão correctas. O utilizador é confrontado com o formulário com as respectivas mensagens de erro
				$this->_redirect ( '/login' );
			}
		
		} else {
			
			//passa as mensagem de erro e o formulário para a VIEW
			$this->view->errors = $form->getMessages ();
			$this->view->form = $form;
		}
	}

}